package upload

import (
	"fmt"
	"net/http"
	"os"
	"path/filepath"
	"ser1/app/slog"
	"ser1/config"
	"ser1/utils"

	"github.com/gin-gonic/gin"
)

// @Summary 上传文件
// @Description 上传单个文件
// @Tags 文件上传
// @Produce json
// @Param file formData file true "上传文件"
// @Success 200 {object} gin.H
// @Router /upload/uploadA [post]
func UploadFileHandler(c *gin.Context) {
	// 默认上传到根目录
	result, err := UploadFileFromContext("uploadA", c, []string{})
	if err != nil {
		utils.ResponseError(c, 1, fmt.Sprintf("上传文件失败: %v", err))
		return
	}

	// 记录日志
	slog.AddOptions(c, "upload_file", map[string]interface{}{
		"filename":  result.Filename,
		"size":      result.Size,
		"directory": result.Directory,
		"path":      result.Path,
	})

	utils.ResponseSuccess(c, gin.H{
		"message": "文件上传成功",
		"file":    result,
	})
}

// UploadFile godoc
// @Summary 上传文件
// @Description 上传单个文件
// @Tags 文件上传
// @Accept mpfd
// @Produce json
// @Param file formData file true "上传文件"
// @Success 200 {object} gin.H
// @Router /upload/uploadB [post]
func UploadFileHandlerB(c *gin.Context) {

	// 默认上传到根目录
	result, err := UploadFileFromContext("uploadB", c, []string{})
	if err != nil {
		utils.ResponseError(c, 1, fmt.Sprintf("上传文件失败: %v", err))
		return
	}

	// 记录日志
	slog.AddOptions(c, "upload_file", map[string]interface{}{
		"filename":  result.Filename,
		"size":      result.Size,
		"directory": result.Directory,
		"path":      result.Path,
	})

	utils.ResponseSuccess(c, gin.H{
		"message": "文件上传成功",
		"file":    result,
	})
}

// UploadFiles godoc
// @Summary 批量上传文件
// @Description 上传多个文件
// @Tags 文件上传
// @Accept mpfd
// @Produce json
// @Param files formData file true "上传文件(可多选)"
// @Success 200 {object} gin.H
// @Router /upload/uploads [post]
func UploadFiles(c *gin.Context) {
	// 获取上传的多个文件
	form, err := c.MultipartForm()
	if err != nil {
		utils.ResponseError(c, 1, "解析表单数据失败")
		return
	}

	files := form.File["files"]
	if len(files) == 0 {
		utils.ResponseError(c, 1, "未找到上传的文件")
		return
	}

	// 获取上传目录配置
	uploadDir := config.GetField("UPLOAD_DIR")
	if uploadDir == "" {
		uploadDir = "./uploads"
	}

	// 确保上传目录存在
	if err := os.MkdirAll(uploadDir, os.ModePerm); err != nil {
		utils.ResponseError(c, 1, "创建上传目录失败")
		return
	}

	// 存储成功上传的文件信息
	uploadedFiles := make([]map[string]interface{}, 0)

	// 逐个处理文件
	for _, file := range files {
		// 直接使用原始文件名（不生成唯一文件名）
		filename := file.Filename

		// 完整文件路径
		filePath := filepath.Join(uploadDir, filename)

		// 保存文件（如果存在会直接覆盖）
		if err := c.SaveUploadedFile(file, filePath); err != nil {
			// 记录失败日志但继续处理其他文件
			slog.AddOptions(c, "upload_file_error", map[string]interface{}{
				"original_name": file.Filename,
				"error":         err.Error(),
			})
			continue
		}

		// 添加到成功列表
		uploadedFiles = append(uploadedFiles, map[string]interface{}{
			"original_name": file.Filename,
			"saved_name":    filename,
			"size":          file.Size,
			"path":          filePath,
		})
	}

	// 记录日志
	slog.AddOptions(c, "upload_files", map[string]interface{}{
		"count": len(uploadedFiles),
		"files": uploadedFiles,
	})

	utils.ResponseSuccess(c, gin.H{
		"message": "文件上传完成",
		"count":   len(uploadedFiles),
		"files":   uploadedFiles,
	})
}

// DeleteFile godoc
// @Summary 删除文件
// @Description 根据ID删除指定文件（硬删除）
// @Tags 文件上传
// @Accept json
// @Produce json
// @Param id query string true "文件ID"
// @Success 200 {object} gin.H
// @Failure 400 {object} gin.H
// @Failure 404 {object} gin.H
// @Router /upload/deleteFile [delete]
func DeleteFileC(c *gin.Context) {
	id := c.Query("id")
	//先检测id是否符合格式要求
	idInt := utils.StrToInt(id)
	if idInt <= 0 {
		utils.ResponseParamError(c)
		return
	}
	var file File
	if err := getDB().Where("id = ?", idInt).First(&file).Error; err != nil {
		utils.ResponseError(c, http.StatusNotFound, "文件不存在")
		return

	}
	// 根据路径删除文件

	uploadPath := "./uploads/"
	filePath := uploadPath + file.Path

	//执行真实删除
	//deleteFile(filePath)

	//直接删除
	//err := getDB().Unscoped().Delete(&file).Error

	//软删除
	err := getDB().Delete(&file).Error

	if err != nil {
		print(filePath)
		utils.LogErrorWithPrefix("删除文件失败", err)
		utils.ResponseSystemError(c)
		return
	}
	utils.ResponseSuccess(c, "删除成功")

}
